package com.ruoyi.web.controller;

import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SuperBalance;
import com.ruoyi.system.domain.vo.BalanceVo;
import com.ruoyi.system.domain.vo.SuperBalanceVo;
import com.ruoyi.system.service.ISuperBalanceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 用户余额Controller
 * 提供用户余额管理的REST API接口
 * 
 * @author ruoyi
 * @date 2025-08-14
 */
@RestController
@RequestMapping("/balance")
public class SuperBalanceController extends BaseController
{
    @Autowired
    private ISuperBalanceService superBalanceService;

    /**
     * 查询用户余额列表
     * 支持分页查询和条件筛选
     */
    @PreAuthorize("@ss.hasPermi('user:balance:list')")
    @GetMapping("/list")
    public TableDataInfo list(SuperBalance superBalance)
    {
        startPage();
        List<SuperBalance> list = superBalanceService.selectSuperBalanceList(superBalance);
        return getDataTable(list);
    }

    /**
     * 查询用户余额列表（包含用户信息）
     * 业务说明：通过关联查询获取余额信息和用户基本信息，用于管理后台显示
     * 返回数据包含：余额ID、用户ID、用户昵称、用户账号、余额数量、创建时间、更新时间
     * 
     * @param superBalance 查询条件对象
     * @return 分页的余额信息列表（包含用户信息）
     */
    @PreAuthorize("@ss.hasPermi('user:balance:list')")
    @GetMapping("/listWithUser")
    public TableDataInfo listWithUser(SuperBalance superBalance)
    {
        startPage();
        List<SuperBalanceVo> list = superBalanceService.selectSuperBalanceVoList(superBalance);
        return getDataTable(list);
    }

    /**
     * 导出用户余额列表
     * 支持Excel格式导出，便于数据分析和备份
     */
    @PreAuthorize("@ss.hasPermi('user:balance:export')")
    @Log(title = "用户余额", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, SuperBalance superBalance)
    {
        List<SuperBalance> list = superBalanceService.selectSuperBalanceList(superBalance);
        ExcelUtil<SuperBalance> util = new ExcelUtil<SuperBalance>(SuperBalance.class);
        util.exportExcel(response, list, "用户余额数据");
    }

    /**
     * 获取用户余额详细信息
     * 根据余额记录ID查询详细信息
     */
    @PreAuthorize("@ss.hasPermi('user:balance:query')")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id)
    {
        return success(superBalanceService.selectSuperBalanceById(id));
    }

    /**
     * 根据用户ID获取余额信息
     * 业务说明：用于快速查询指定用户的余额信息，常用于用户登录后显示余额
     * 应用场景：用户个人中心、余额查询页面等
     * 
     * @param userId 用户ID（路径参数）
     * @return 该用户的余额信息，如果用户没有余额记录则返回空数据
     */
    @PreAuthorize("@ss.hasPermi('user:balance:query')")
    @GetMapping(value = "/user/{userId}")
    public AjaxResult getInfoByUserId(@PathVariable("userId") Long userId)
    {
        return success(superBalanceService.selectSuperBalanceByUserId(userId));
    }

    /**
     * 新增用户余额
     * 用于创建用户的初始余额记录
     */
    @PreAuthorize("@ss.hasPermi('user:balance:add')")
    @Log(title = "用户余额", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody SuperBalance superBalance)
    {
        return toAjax(superBalanceService.insertSuperBalance(superBalance));
    }

    /**
     * 修改用户余额
     * 用于直接修改用户的余额数量
     */
    @PreAuthorize("@ss.hasPermi('user:balance:edit')")
    @Log(title = "用户余额", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody SuperBalance superBalance)
    {
        return toAjax(superBalanceService.updateSuperBalance(superBalance));
    }

    /**
     * 增加用户余额
     * 业务说明：用于用户获得余额时的业务场景，如充值、退款、活动奖励等
     * 实现逻辑：直接在现有余额基础上增加指定数量，无上限限制
     * 安全考虑：需要相应的权限验证，防止恶意增加余额
     * 
     * @param userId 用户ID（请求参数）
     * @param balance 增加的余额数（必须为正数）
     * @return 操作结果，成功返回1，失败返回0
     */
    @PreAuthorize("@ss.hasPermi('user:balance:edit')")
    @Log(title = "增加用户余额", businessType = BusinessType.UPDATE)
    @PutMapping("/increase")
    public AjaxResult increaseBalance(@RequestParam Long userId, @RequestParam java.math.BigDecimal balance)
    {
        return toAjax(superBalanceService.increaseUserBalance(userId, balance));
    }

    /**
     * 减少用户余额
     * 业务说明：用于用户消费余额时的业务场景，如购物、扣费、余额兑换等
     * 实现逻辑：确保余额不会变为负数，如果余额不足则操作失败
     * 安全考虑：在SQL层面进行余额检查，防止余额变为负数
     * 
     * @param userId 用户ID（请求参数）
     * @param balance 减少的余额数（必须为正数）
     * @return 操作结果，成功返回1，失败返回0（余额不足或用户不存在）
     */
    @PreAuthorize("@ss.hasPermi('user:balance:edit')")
    @Log(title = "减少用户余额", businessType = BusinessType.UPDATE)
    @PutMapping("/decrease")
    public AjaxResult decreaseBalance(@RequestParam Long userId, @RequestParam java.math.BigDecimal balance, @RequestBody BalanceVo balanceVo)
    {
        return toAjax(superBalanceService.decreaseUserBalance(userId, balance, balanceVo));
    }

    /**
     * 删除用户余额
     * 支持批量删除操作
     */
    @PreAuthorize("@ss.hasPermi('user:balance:remove')")
    @Log(title = "用户余额", businessType = BusinessType.DELETE)
	@DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids)
    {
        return toAjax(superBalanceService.deleteSuperBalanceByIds(ids));
    }
}
